<?php
/**
 * session储存数据库
 *
 * PHP提供了一个函数，通过指定这个函数名，并重写默认的session引擎，可以实现所需的任务
 * 这个函数被称为session_set_save_handler(),它需要六个参数Opening the session data store 打开session数据存储
 *=============================================================================
 *Opening the session data store 打开session数据存储
 *Closing the session data store 关闭session数据存储
 *Reading session data 读session数据
 *Writing session data 写session数据
 *Destroying all session data 销毁全部session数据
 *Cleaning out old session data 清空旧session数据
 * ================================================================================
 *
 */

class Session{
    public $hose='127.0.0.1';  //数据库连接地址
    public $username='root';   //数据库用户名
    public $pwd='';            //数据库密码
    public $dbname='blog';     //数据库表名

    public $lifetime = 1800;   // 有效期，单位：秒（s），默认30分钟
    public $gc_probability = 1;
    public $gc_divisor     = 100;
    public $link;

    function __construct(){
            $this->content();
            session_set_save_handler(
                array(&$this, 'open'),      // 在运行session_start()时执行
                array(&$this, 'close'),     // 在脚本执行完成 或 调用session_write_close() 或 session_destroy()时被执行，即在所有session操作完后被执行
                array(&$this, 'read'),      // 在运行session_start()时执行，因为在session_start时，会去read当前session数据
                array(&$this, 'write'),     // 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
                array(&$this, 'destroy'),   // 在运行session_destroy()时执行
                array(&$this, 'gc')         // 执行概率由session.gc_probability 和 session.gc_divisor的值决定，时机是在open，read之后，session_start会相继执行open，read和gc
            );

            session_start(); // 这也是必须的，打开session，必须在session_set_save_handler后面执行

    }

    function content(){
        $link= mysqli_connect($this->hose, $this->username,$this->pwd,$this->dbname);
        if(!$link){
            exit('数据库连接失败');
        }else{
            $this->link=$link;
        }
    }

    /**
     * 打开session
     * @param $save_path
     * @param $session_name
     * @return bool
     */
    function open($save_path, $session_name){
        return true;
    }

    /**
     * 关闭session
     * @return bool
     */
    function close(){
        return true;
    }

    /**
     * 读取session数据
     * @param $sessionid
     * @return string
     */
    function read($sessionid){
        $sql='select * from session where sessionid="'.$sessionid.'"';
        if($result=mysqli_query($this->link,$sql)){
            $row = mysqli_fetch_array($result);
            $data=unserialize($row["data"]);
            return $data;
        }else{
            return '';
        }
    }


    /**
     * 读取session数据
     * @param $sessionid
     * @param $data
     * @return bool
     */
    function write($sessionid,$data){
        $sql="select * from session where sessionid='$sessionid'";
        $result=mysqli_query($this->link,$sql);
        $data=serialize($data);
        $num=mysqli_num_rows($result);
        if($num>0){
            $sql="update session set data='$data',`time`=".time()." where sessionid='$sessionid'";
            $result=mysqli_query($this->link,$sql);
            if($result){
                return true;
            }else{
                return false;
            }
        }else{
            $sql = "insert into session(sessionid,data,`time`) values ( '$sessionid', '$data',".time().")";
            $result=mysqli_query($this->link,$sql);
            if($result){
                return true;
            }else{
                return false;
            }
        }

    }

    /**
     * 销毁session
     * @param $sessionid
     * @return bool
     */
    function destroy($sessionid){
        $sql="DELETE * FROM  session WHERE id='$sessionid'";
        $result=mysqli_query($this->link,$sql);
        if($result){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 垃圾回收机制
     * @param $lifetime
     * @return bool
     */
    function gc($lifetime){
        $sql="DELETE * FROM  session WHERE `time`<".time()-$this->lifetime."";
        $result=mysqli_query($this->link,$sql);
        $num=mysqli_num_rows($result);
        if($num>0){
            return true;
        }else{
            return false;
        }
    }



}